﻿#include "Serialport.h"
#include "printf_log.h"
#include "communication.h"

CSerialPort *g_serial_port = nullptr;
bool g_IsRunSerial = false;

int g_serial_size;
unsigned char g_serial_data[256];
QMutex g_mutex_serial_update;

#include <QThread>

/*
//从接收缓冲区中读取数据
QByteArray buffer = serial.readAll();

1 char *ch;//不要定义成ch[n];
2 QByteArray byte;
3 ch = byte.data();

*/
CSerialPort::CSerialPort()
{

}

int CSerialPort::SerialPort_Init(QString PortName,int BaudRate)
{
    //设置串口名
    serial.setPortName(PortName);

    //设置波特率
    serial.setBaudRate(BaudRate);

    //设置数据位数
    serial.setDataBits(QSerialPort::Data8);

    //设置奇偶校验
    serial.setParity(QSerialPort::NoParity);

    //设置停止位
    serial.setStopBits(QSerialPort::OneStop);
    //serial.setStopBits(QSerialPort::TwoStop);

    //设置流控制
    serial.setFlowControl(QSerialPort::NoFlowControl);

    //打开串口
    if(!serial.open(QIODevice::ReadWrite))
    {
        return -1;
    }
    g_IsRunSerial = true;
    //连接信号槽
    QObject::connect(&serial, &QSerialPort::readyRead, this, &CSerialPort::Read_Data);

    timer = new QTimer(this);

    connect(timer,&QTimer::timeout,this,&CSerialPort::readMyCom);//timeout执行真正的读取操作

    return 0;

}

void CSerialPort::Read_Data()
{
//    //从接收缓冲区中读取数据
//    //char *data_buf;
//    serial.waitForReadyRead(100);
//    QByteArray buf;
//    buf = serial.readAll();
//    if(!buf.isEmpty())
//    {
//        g_mutex_serial_update.lock();
//        g_serial_size = buf.size();
//        memcpy(g_serial_data,buf,g_serial_size);
//        g_mutex_serial_update.unlock();
//        emit update_serial_data();
//        QString  str_data = CCommunication::toHexStr(buf,buf.size()*2);
//        lzc_debug<< "data:"<<str_data;

//    }
//    buf.clear();

    timer->start(5);
    buffer.append(serial.readAll());//将读到的数据放入缓冲区

}

void CSerialPort::readMyCom()
{
   timer->stop();//关闭定时器
   QByteArray data = buffer;//读取缓冲区数据


   g_mutex_serial_update.lock();
   g_serial_size = data.size();
   memcpy(g_serial_data,data,g_serial_size);
   g_mutex_serial_update.unlock();
   emit update_serial_data();
   QString  str_data = CCommunication::toHexStr(data,data.size()*2);
   lzc_debug<< "data:"<<str_data;

    buffer.clear();//清除缓冲区

}


int CSerialPort::SerialPort_Write(int size,char *buffer)
{
    QByteArray data;
    data.resize(size);
    for(int i=0;i<size;i++)
    {
        data[i]=buffer[i];
    }

    serial.write(data);
    return 0;
}


int CSerialPort::SerialPort_Close()
{
    //关闭串口
    serial.close();
    g_IsRunSerial = false;
    return 0;
}








